home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / comm / misc / DigiCam.lha / src / cameraops.c < prev    next >
C/C++ Source or Header  |  1999-07-15  |  12KB  |  481 lines

  1. /* cameraops.c (c) 1999 by Volker Remuß, remuss@cs.tu-berlin.de */
  2.  
  3. /* Camera */
  4. #include "cameraops.h"
  5. #include "camera.h"
  6.  
  7. /* ANSI */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11. #include <errno.h>
  12. #include <string.h>
  13.  
  14. /* Amiga */
  15. #include <proto/utility.h>                // Stricmp
  16.  
  17. #define OutOfRange { printf("You Requested something out of Range, ignored.\n"); return(0); }
  18.  
  19. unsigned int32 makeint32(unsigned char *inbuf)
  20. {
  21.     return (unsigned int32)(inbuf[0] | inbuf[1] << 8 | inbuf[2] << 16 | inbuf[3] << 24);
  22. }
  23.  
  24.  
  25. unsigned char *getvdatastring(int16 reg)
  26. {
  27.     int16 size=0;
  28.  
  29.     initgetvdatareg(reg);
  30.  
  31.     if ((-1 == getdatapacket(buf, &size, 0, 0))
  32.         || (size == 0))
  33.     {
  34.         buf[0]=0;
  35.     }
  36.     else
  37.     {
  38.         buf[size]=0;
  39.     }
  40.  
  41.     return(buf);
  42. }
  43.  
  44.  
  45. int16 dircamera(void)
  46. {
  47.     int16 frames;
  48.     int16 size;
  49.     int16 i;
  50.     int32 time;
  51.     char *datestring;
  52.  
  53.     frames = getint32reg(FRAMES_TAKEN);
  54.  
  55.     printf("\nStill Images\n");
  56.  
  57.    printf(" No.  Imagesz  Thumbsz  Audiosz  R  P  Date                      ?  ?\n");
  58.  
  59.     for (i=1; i <= frames; i++)
  60.     {
  61.         if (putint32reg(CURRENT_FRAME, i)) return (-1);
  62.         initgetvdatareg(PICTURE_SUMMARY);
  63.         if (getdatapacket(buf, &size, 0, 0)) return (-1);
  64.         buf[0] = 0;
  65.  
  66.         time = makeint32(buf+20);
  67.         datestring = asctime(gmtime((time_t *)&time));
  68.         datestring[24] = 20;
  69.  
  70.         printf(" %3d %8d %8d %8d %2d %2d %26s %2d %2d\n",
  71.                  i,
  72.                  makeint32(buf   ),
  73.                  makeint32(buf+ 4),
  74.                  makeint32(buf+ 8),
  75.                  makeint32(buf+12),
  76.                  makeint32(buf+16),
  77.                  datestring,
  78.                  makeint32(buf+24),
  79.                  makeint32(buf+28));
  80.     }
  81.  
  82.     initgetvdatareg(CAMERA_SUMMARY);
  83.     if (getdatapacket(buf, &size, 0, 0)) return (-1);
  84.     frames = makeint32(buf+28);
  85.  
  86.     printf("\nAnimations\n");
  87.    printf(" No.   Animsz  Thumbsz  Audiosz  R  P  Date                      ?  ?\n");
  88.  
  89.     for (i=1; i <= frames; i++)
  90.     {
  91.         if (putint32reg(CURRENT_FRAME, (0xff << 24 | i))) return (-1);
  92.         initgetvdatareg(PICTURE_SUMMARY);
  93.         if (getdatapacket(buf, &size, 0, 0)) return (-1);
  94.         buf[0] = 0;
  95.  
  96.         time = makeint32(buf+20);
  97.         datestring = asctime(gmtime((time_t *)&time));
  98.         datestring[24] = 20;
  99.  
  100.         printf(" %3d %8d %8d %8d %2d %2d %26s %2d %2d\n",
  101.                  i,
  102.                  makeint32(buf   ),
  103.                  makeint32(buf+ 4),
  104.                  makeint32(buf+ 8),
  105.                  makeint32(buf+12),
  106.                  makeint32(buf+16),
  107.                  datestring,
  108.                  makeint32(buf+24),
  109.                  makeint32(buf+28));
  110.     }
  111.  
  112.     return(0);
  113. }
  114.  
  115.  
  116. int16 saveframe(int32 frame, char *filename, int16 type)
  117. {
  118.     int16 lastpack=0;
  119.     FILE *fh;
  120.     int16 size;
  121.     int16 seqnr;
  122.     int16 lastseqnr=-1;
  123.     int16 cycles;
  124.  
  125.     if (!(fh = fopen(filename, "wb")))
  126.     {
  127.         printf("File error: %s\n", strerror(errno));
  128.         return(-1);
  129.     }
  130.  
  131.     printf("%s ", filename);
  132.     cycles=0;
  133.  
  134.     putint32reg(CURRENT_FRAME, frame);
  135.     switch (type)
  136.     {
  137.         case PICT:  initgetvdatareg(14); break;
  138.         case ANIM:  initgetvdatareg(14); break;
  139.         case THUMB: initgetvdatareg(15); break;
  140.         case AUDIO: initgetvdatareg(44); break;
  141.  
  142.         default:    initgetvdatareg(15); break;    
  143.     }
  144.         
  145.     while (!(lastpack))
  146.     {
  147.         if ((-1 == getdatapacket(buf, &size, &lastpack, &seqnr))
  148.             || (((lastseqnr + 1) & 0xff) != seqnr)                        // Modulo 256 since especially Anims can be longer than 255 packages but sequencenumber has only 8 Bit
  149.             || (size == 0))
  150.         {
  151.             fclose(fh);
  152.             printf("Download failed.\n");
  153.             remove(filename);
  154.             return(-1);
  155.         }
  156.         lastseqnr++;
  157.         fwrite(buf, size, 1, fh);
  158.         printf(".");
  159.         cycles++;
  160.         if ((!(lastpack)) && cycles && (!(cycles % 10))) printf("%dk", cycles<<1);
  161.         fflush(stdout);
  162.     }
  163.  
  164.     fclose(fh);
  165.     printf("\n");
  166.  
  167.     return(0);
  168. }
  169.  
  170.  
  171. int16 camerainfo(void)
  172. {
  173.     int32 time;
  174.     char *datestring;
  175.  
  176.     printf("\n");
  177.     printf("Manufacturer     : %s\n", getvdatastring(MANUFACTURER));
  178.     printf("Model            : %s\n", getvdatastring(MODEL));
  179.     printf("Version          : %s\n", getvdatastring(VERSION));
  180.     printf("Camera I.D.      : %s\n", getvdatastring(CAMERA_ID));
  181.  
  182.     time = getint32reg(CLOCK);
  183.     datestring = asctime(gmtime((time_t *)&time));
  184.     printf("Cameratime       : %s", datestring);
  185.  
  186.     printf("\n");
  187.     printf("Frames Taken     : %d\n", getint32reg(FRAMES_TAKEN));
  188.     printf("Frames Left      : %d\n", getint32reg(FRAMES_LEFT));
  189.     printf("Free Mem         : %d\n", getint32reg(FREEMEM));
  190.     printf("Battery Capacity : %d%%\n", getint32reg(BATTERY));
  191.     printf("Resolution       : %d\n", getint32reg(RESOLUTION));
  192.     printf("Shutter Speed    : %d\n", getint32reg(SHUTTER_SPEED));
  193.     printf("Flash Mode       : %d\n", getint32reg(FLASH_MODE));
  194.     printf("Lens Mode        : %d\n", getint32reg(LENS_MODE));
  195.  
  196.     printf("Autoshut on host : %d\n", getint32reg(AUTOSHUT_ON_HOST));
  197.     printf("Autoshut in field: %d\n", getint32reg(AUTOSHUT_IN_FIELD));
  198.  
  199.     printf("LCD Shutdowntime : %d\n", getint32reg(LCD_AUTOSHUT));
  200.     printf("LCD Dateformat   : %d\n", getint32reg(LCD_DATE));
  201.     printf("LCD Brightness   : %d\n", getint32reg(LCD_BRIGHTNESS));
  202.     printf("Aperture         : %d\n", getint32reg(APERTURE));
  203.     printf("Color Mode       : %d\n", getint32reg(COLOR_MODE));
  204.     printf("Exposure Meter   : %d\n", getint32reg(EXP_METER));
  205.     printf("Bitmap           : %d\n", getint32reg(BITMAP));
  206.     printf("Bright./Contrast : %d\n", getint32reg(BRIGHTNESS_CONTRAST));
  207.     printf("White Balance    : %d\n", getint32reg(WHITE_BALANCE));
  208.  
  209.     return(0);
  210.  
  211. }
  212.  
  213.  
  214. int16 saveframerange(char *range, int16 type, char *filename, char *stringbuf)
  215. /* 
  216.     Saves a range of pictures or thumbnails, All, Range or single - Thumbs or Frames
  217.     range        : is "all" "xx-yy" or a single "xx"
  218.     type        : is PICT or THUMB to save
  219.     filename    : the basename for the filename, suffix will be generated
  220.     stringbuf: has to be big enough to keep filename + generated suffix
  221. */
  222. {
  223.     int32 i;
  224.     int32 res;
  225.     int32 framecount;
  226.     char *tmpstr;
  227.  
  228.     if (!(filename))
  229.     {
  230.         printf("Filename needed!\n");
  231.         return(-1);
  232.     }
  233.  
  234.     framecount = getint32reg(FRAMES_TAKEN);
  235.  
  236.     if (!(Stricmp("all", range)))                                // save all?
  237.     {
  238.         for (i=1; i <= framecount; i++)
  239.         {
  240.             if (type == THUMB)
  241.                 sprintf(stringbuf, "%s_%dth.jpg", filename, i);
  242.             else    
  243.                 sprintf(stringbuf, "%s_%d.jpg", filename, i);
  244.             saveframe(i, stringbuf, type);
  245.         }
  246.     }
  247.     else
  248.     {
  249.         if (tmpstr=strstr(range, "-"))                        // save range?
  250.         {
  251.             tmpstr[0] = 0;
  252.             for (i=atoi(range); i <= atoi(tmpstr+1); i++) 
  253.             {
  254.                 if ((unsigned)i > (unsigned)framecount) OutOfRange;
  255.                 if (type == THUMB)
  256.                     sprintf(stringbuf, "%s_%dth.jpg", filename, i);
  257.                 else    
  258.                     sprintf(stringbuf, "%s_%d.jpg", filename, i);
  259.                 saveframe(i, stringbuf, type);
  260.             }
  261.         }
  262.         else                                                        // save single Frame/Thumb
  263.         {
  264.             
  265.             if (((unsigned)(res=atoi(range))) > (unsigned)framecount) OutOfRange;
  266.             if (type == THUMB)
  267.                 sprintf(stringbuf, "%s_%dth.jpg", filename, res);
  268.             else    
  269.                 sprintf(stringbuf, "%s_%d.jpg", filename, res);
  270.             saveframe(res, stringbuf, type);
  271.         }        
  272.     }
  273.     return(0);
  274. }
  275.  
  276.  
  277. int16 saveanimrange(char *range, int16 type, char *filename, char *stringbuf)
  278. /* 
  279.     Saves a range of Anims, All, Range or single - Thumbs or Frames
  280.     range        : is "all" "xx-yy" or a single "xx"
  281.     filename    : the basename for the filename, suffix will be generated
  282.     stringbuf: has to be big enough to keep filename + generated suffix
  283.  
  284.     Funtions is very similar to saveframerange and could be integrated
  285.     in it, loosing some clearity.
  286. */
  287. {
  288.     int32 i;
  289.     int32 res;
  290.     int32 animcount;
  291.     int16 size;
  292.     char *tmpstr;
  293.  
  294.     if (!(filename))
  295.     {
  296.         printf("Filename needed!\n");
  297.         return(-1);
  298.     }
  299.  
  300.     initgetvdatareg(CAMERA_SUMMARY);                            // How many anims are there?
  301.     if (getdatapacket(buf, &size, 0, 0)) return (-1);
  302.     animcount = makeint32(buf+28);
  303.  
  304.  
  305.     if (!(Stricmp("all", range)))                                // save all?
  306.     {
  307.         for (i=1; i <= animcount; i++)
  308.         {
  309.             if (type == THUMB)
  310.                 sprintf(stringbuf, "%s_%d_ath.jpg", filename, i);
  311.             else
  312.                 sprintf(stringbuf, "%s_%d.avi", filename, i);
  313.             saveframe((0xff<<24 | i), stringbuf, type);
  314.         printf("Frame %x\n", (0xff<<24 | animcount));
  315.         }
  316.     }
  317.     else
  318.     {
  319.         if (tmpstr=strstr(range, "-"))                        // save range?
  320.         {
  321.             tmpstr[0] = 0;                                            // cut string on "-"
  322.             for (i=atoi(range); i <= atoi(tmpstr+1); i++) 
  323.             {
  324.                 if ((unsigned)i > (unsigned)animcount) OutOfRange;
  325.  
  326.                 if (type == THUMB)
  327.                     sprintf(stringbuf, "%s_%d_ath.jpg", filename, i);
  328.                 else
  329.                     sprintf(stringbuf, "%s_%d.avi", filename, i);
  330.                 saveframe((0xff<<24 | i), stringbuf, type);
  331.             }
  332.         }
  333.         else                                                        // save single Frame/Thumb
  334.         {
  335.             if (((unsigned)(res = atoi(range))) > (unsigned)animcount) OutOfRange;
  336.             if (type == THUMB)
  337.                 sprintf(stringbuf, "%s_%d_ath.jpg", filename, res);
  338.             else
  339.                 sprintf(stringbuf, "%s_%d.avi", filename, res);
  340.             saveframe((0xff<<24 | res), stringbuf, type);
  341.         }        
  342.     }
  343.     return(0);
  344. }
  345.  
  346.  
  347. int16 savewavs(char *range, char *filename, char *stringbuf)
  348. /* 
  349.     Saves a range of Wavs, All, Range or single
  350.     range        : is "all" "xx-yy" or a single "xx"
  351.     filename    : the basename for the filename, suffix will be generated
  352.     stringbuf: has to be big enough to keep filename + generated suffix
  353. */
  354. {
  355.     int32 i;
  356.     int32 res;
  357.     int32 framecount;
  358.     int16 size;
  359.     char *tmpstr;
  360.  
  361.     if (!(filename))
  362.     {
  363.         printf("Filename needed!\n");
  364.         return(-1);
  365.     }
  366.  
  367.     framecount = getint32reg(FRAMES_TAKEN);
  368.  
  369.     if (!(Stricmp("all", range)))                                // save all?
  370.     {
  371.         for (i=1; i <= framecount; i++)
  372.         {
  373.             sprintf(stringbuf, "%s_%d.wav", filename, i);
  374.  
  375.             if (putint32reg(CURRENT_FRAME, i)) return (-1);
  376.             initgetvdatareg(PICTURE_SUMMARY);
  377.             if (getdatapacket(buf, &size, 0, 0)) return (-1);
  378.             if (makeint32(buf+ 8) > 0)
  379.                 saveframe(i, stringbuf, AUDIO);
  380.         }
  381.     }
  382.     else
  383.     {
  384.         if (tmpstr=strstr(range, "-"))                        // save range?
  385.         {
  386.             tmpstr[0] = 0;
  387.             for (i=atoi(range); i <= atoi(tmpstr+1); i++) 
  388.             {
  389.                 if ((unsigned)i > (unsigned)framecount) OutOfRange;
  390.  
  391.                 sprintf(stringbuf, "%s_%d.wav", filename, i);
  392.  
  393.                 if (putint32reg(CURRENT_FRAME, i)) return (-1);
  394.                 initgetvdatareg(PICTURE_SUMMARY);
  395.                 if (getdatapacket(buf, &size, 0, 0)) return (-1);
  396.                 if (makeint32(buf+ 8) > 0)
  397.                     saveframe(i, stringbuf, AUDIO);
  398.             }
  399.         }
  400.         else                                                        // save single Frame/Thumb
  401.         {
  402.             if (((unsigned)(res=atoi(range))) > (unsigned)framecount) OutOfRange;
  403.  
  404.             sprintf(stringbuf, "%s_%d.wav", filename, res);
  405.  
  406.             if (putint32reg(CURRENT_FRAME, res)) return (-1);
  407.             initgetvdatareg(PICTURE_SUMMARY);
  408.             if (getdatapacket(buf, &size, 0, 0)) return (-1);
  409.             if (makeint32(buf+ 8) > 0)
  410.                 saveframe(res, stringbuf, AUDIO);
  411.         }        
  412.     }
  413.     return(0);
  414. }
  415.  
  416.  
  417. int16 eraserange(char *range, int16 type)
  418. /* 
  419.     Erase a range of Anims/Picts, All, Range or single
  420.     range        : is "all" "xx-yy" or a single "xx"
  421.     type     : PICT or ANIM
  422. */
  423. {
  424.     int32 i;
  425.     int32 res;
  426.     int32 count;
  427.     int16 size;
  428.     char *tmpstr;
  429.  
  430.     if (type == ANIM)                                            // How many are there?
  431.     {
  432.         initgetvdatareg(CAMERA_SUMMARY);
  433.         if (getdatapacket(buf, &size, 0, 0)) return (-1);
  434.         count = makeint32(buf+28);
  435.     }
  436.     else
  437.         count = getint32reg(FRAMES_TAKEN);
  438.  
  439.     if (!(Stricmp("all", range)))                                // save all?
  440.     {
  441.         for (i=1; i <= count; i++)
  442.         {
  443.             if (type == ANIM)
  444.                 putint32reg(CURRENT_FRAME, 0xff<<24 | 1 );
  445.             else
  446.                 putint32reg(CURRENT_FRAME, 1);
  447.             printf("Deleting %d\n", i);
  448.             takeaction(ERASE_CURRENT, 0);
  449.         }
  450.     }
  451.     else
  452.     {
  453.         if (tmpstr=strstr(range, "-"))                        // save range?
  454.         {
  455.             tmpstr[0] = 0;                                            // cut string on "-"
  456.             for (res=i=atoi(range); i <= atoi(tmpstr+1); i++) 
  457.             {
  458.                 if ((unsigned)i > (unsigned)count) OutOfRange;
  459.                 if (type == ANIM)
  460.                     putint32reg(CURRENT_FRAME, 0xff<<24 | res );
  461.                 else
  462.                     putint32reg(CURRENT_FRAME, res);
  463.                 printf("Deleting %d\n", i);
  464.                 takeaction(ERASE_CURRENT, 0);
  465.             }
  466.         }
  467.         else                                                        // save single Frame/Thumb
  468.         {
  469.             if (((unsigned)(res = atoi(range))) > (unsigned)count) OutOfRange;
  470.             if (type == ANIM)
  471.                 putint32reg(CURRENT_FRAME, 0xff<<24 | res );
  472.             else
  473.                 putint32reg(CURRENT_FRAME, res);
  474.             printf("Deleting %d\n", res);
  475.             takeaction(ERASE_CURRENT, 0);
  476.         }        
  477.     }
  478.     return(0);
  479. }
  480.  
  481.